package com.atguigu.spring.pojo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class ProxyFactory {
    private Object target;
    public ProxyFactory(Object target) {
        this.target = target;
    }
    public Object getProxy(){
        /**
         * ClassLoader loader:根类加载器(C，核心类库)，扩展类加载器（扩展类库），应用类加载器（第三方jar），自定义加载器
         * Class<?>[] interfaces:获取目标对象的实现的所有接口的class对象的数组；
         * InvocationHandler h:设置代理类中的抽象方法如何重写；
         */
        ClassLoader classLoader = target.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();
        InvocationHandler invocationHandler = new InvocationHandler() {//指明代理对象啊你个需要干什么呢
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //proxy：表示代理对象，method：要执行的方法，args表示要执行方法的参数列表
                Object result = null;
                try {
                    System.out.println("日志，方法:"+method.getName()+",参数:"+ Arrays.toString(args));
                    result = method.invoke(target, args);
                    System.out.println("日志，方法:"+method.getName()+",结果:"+ result);
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("日志，方法:"+method.getName()+",异常:"+ e);
                } finally {
                    System.out.println("日志，方法:"+method.getName()+",方法执行完毕");
                }
                return result;
            }
        };
        return Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
    }
}
